package com.example.database.dao;

import com.example.database.entity.*;
import com.example.database.enums.Status;

import java.util.List;

public interface StudentDao {
    // 添加学生
    Boolean addStudent(Student student);
    // 删除学生
    Boolean deleteStudentById(Integer studentId);
    // 更新学生信息
    Boolean updateStudent(Student student);
    // 查询学生
    Student findStudentById(Integer studentId);
    // 查询学生对应的辅导员信息
    ClassInstructor findClassInstructorByStudentId(Integer studentId);
    // 查询一个校区的学生
    List<Student> findStudentByCampus(Integer campusId);
    // 查询一个校区的进出信息
    List<InOutLog> findLogByCampus(Integer campusId);
    // 超级管理员查询所有的入校申请
    List<AdmissionForm> findAdmissionFormAll();
    // 超级管理员查询所有出校申请
    List<LeavingForm> findLeavingFormAll();
    // 查询一个院系的进校申请
    List<AdmissionForm> findAdmissionFormByDepartment(Integer departmentId);
    // 院系管理员处理进校申请
    Boolean processAdmissionFormByDeptInstructor(Integer formId,boolean operation,String approveTime,String reason);
    // 查询一个院系的离校申请
    List<LeavingForm> findLeavingFormByDepartment(Integer departmentId);
    // 院系管理员处理离校申请
    Boolean processLeavingFormByDeptInstructor(Integer formId,boolean operation,String approveTime,String reason);
    // 查询一个班级的进校申请
    List<AdmissionForm> findAdmissionFormByClass(Integer classId);
    // 班级管理员处理进校申请
    Boolean processAdmissionFormByClassInstructor(Integer formId,boolean operation,String approveTime,String reason);
    // 查询一个班级的离校申请
    List<LeavingForm> findLeavingFormByClass(Integer classId);
    // 班级管理员处理离校申请
    Boolean processLeavingFormByClassInstructor(Integer formId,boolean operation,String approveTime,String reason);
    // 学生填写入校申请
    Boolean addAdmissionForm(AdmissionForm admissionForm);
    // 学生填写出校申请
    Boolean addLeavingForm(LeavingForm leavingForm);
    // 学生填写健康日报
    Boolean addHealthForm(HealthForm healthForm);
    // 查询一位学生过去n天的健康填报信息
    List<HealthForm> findNDaysHealthInfo(Integer studentId,Integer nDays);
    // 查询一位学生的入校申请 通过状态进行筛选
    List<AdmissionForm> findAdmissionFormByStudentId(Integer studentId, Status state);
    // 查询一位学生的出校申请 通过状态进行筛选
    List<LeavingForm> findLeavingFormByStudentId(Integer studentId,Status state);
    // 提交入校申请最多的学生，支持按多级范围（全校、院系、班级）进行筛选；
    List<Student> findMostAdmissionStudentAll();
    List<Student> findMostAdmissionStudentByDept(Integer deptId);
    List<Student> findMostAdmissionStudentByClass(Integer classId);
    // 查询一位学生（从当天算起）过去一年的离校总时长
    String OutOfSchoolTimeOneYearByStudentId(Integer studentId);
    // 已提交出校申请但未离校的学生数量、个人信息；
    Integer regOutButInSchoolNum();
    // 已提交出校申请但未离校的个人信息；
    List<Student> regOutButInSchoolStudentInfo();
    // 已出校但尚未返回校园（即离校状态）的学生数量；
    Integer outSchoolStudentNum();
    // 已出校但尚未返回校园（即离校状态）个人信息(包含了)各自的离校时间；
    List<Student> outSchoolStudentInfo();
    // TODO
    // 连续 n 天填写“健康日报”时间（精确到分钟）完全一致的学生数量，个人信息；

    // 过去 n 天一直在校未曾出校的学生，支持按多级范围（全校、院系、班级）进行筛选；

    // 前 n 个平均离校时间最长的学生，支持按多级范围（全校、院系、班级）进行筛选；


    // 未提交出校申请但离校状态超过 24h 的学生数量、个人信息；

    // 过去 n 天每个院系学生产生最多出入校记录的校区。

    //？查询过去n天尚未批准的入校申请和出校申请的数量和详细信息 （总的？不分院系？还是在院系或者班级的基础上再查询前n天？）


}
